#!/bin/bash
set -u

APP_MACOS_DIR="$(cd "$(dirname "$0")" && pwd)"
BUNDLED_AGENT_SCRIPT="$APP_MACOS_DIR/../Resources/agent/bin/melody-agent.js"
if [ -f "$BUNDLED_AGENT_SCRIPT" ]; then
  AGENT_SCRIPT="$BUNDLED_AGENT_SCRIPT"
  PROJECT_ROOT="$(cd "$APP_MACOS_DIR/../Resources" && pwd)"
else
  AGENT_SCRIPT="$(cd "$APP_MACOS_DIR/../../../.." && pwd)/bin/melody-agent.js"
  PROJECT_ROOT="$(cd "$APP_MACOS_DIR/../../../../../.." && pwd)"
fi
LOG_DIR="$HOME/Library/Logs/Melody Companion"
mkdir -p "$LOG_DIR"
LOG_FILE="$LOG_DIR/companion.log"
LOCAL_CONFIG_DIR="$HOME/.melody"
LOCAL_CONFIG_PATH="$LOCAL_CONFIG_DIR/companion.json"
export MELODY_LOCAL_CONFIG_PATH="$LOCAL_CONFIG_PATH"
mkdir -p "$LOCAL_CONFIG_DIR"
chmod 700 "$LOCAL_CONFIG_DIR" >/dev/null 2>&1 || true

find_node() {
  for candidate in /opt/homebrew/bin/node /usr/local/bin/node /usr/bin/node; do
    if [ -x "$candidate" ]; then
      echo "$candidate"
      return 0
    fi
  done
  if command -v node >/dev/null 2>&1; then
    command -v node
    return 0
  fi
  return 1
}

show_dialog() {
  /usr/bin/osascript <<APPLESCRIPT >/dev/null
display dialog "$1" buttons {"OK"} default button "OK" with title "Melody Companion"
APPLESCRIPT
}

choose_config() {
  /usr/bin/osascript <<'APPLESCRIPT'
try
  set downloadsFolder to path to downloads folder
  set configFile to choose file with prompt "Kies de melody-companion.json die je uit Melody hebt gedownload" default location downloadsFolder
  set configText to read configFile
  set targetFile to POSIX file (system attribute "MELODY_LOCAL_CONFIG_PATH")
  set targetHandle to open for access targetFile with write permission
  set eof of targetHandle to 0
  write configText to targetHandle
  close access targetHandle
  POSIX path of configFile
on error errorMessage
  try
    close access targetFile
  end try
  return "ERROR: " & errorMessage
end try
APPLESCRIPT
}

validate_local_config() {
  /usr/bin/osascript <<'APPLESCRIPT'
try
  set configFile to POSIX file (system attribute "MELODY_LOCAL_CONFIG_PATH")
  set configText to read configFile
  if configText does not contain "melody_agent_" then
    return "ERROR: De gekozen serverconfig bevat geen geldige Melody agent-token."
  end if
  return ""
on error errorMessage
  return "ERROR: " & errorMessage
end try
APPLESCRIPT
}

NODE_BIN="$(find_node || true)"
if [ -z "$NODE_BIN" ]; then
  show_dialog "Node.js is nog niet gevonden. De eerste ontwikkelbuild heeft Node nodig; de volgende packaging stap bundelt dit mee."
  exit 1
fi

if [ ! -f "$AGENT_SCRIPT" ]; then
  show_dialog "Melody Companion kan de agent niet vinden naast deze app."
  exit 1
fi

SELECTED_CONFIG_PATH="$(choose_config | tail -n 1 | tr -d '\r')"
if [ -z "$SELECTED_CONFIG_PATH" ]; then
  show_dialog "Geen melody-companion.json gekozen. Download eerst de serverconfig uit Melody."
  exit 1
fi
if [[ "$SELECTED_CONFIG_PATH" == ERROR:* ]]; then
  show_dialog "De serverconfig kon niet worden gelezen. Download een nieuwe melody-companion.json en probeer opnieuw. Details: ${SELECTED_CONFIG_PATH#ERROR: }"
  exit 1
fi

CONFIG_VALIDATION="$(validate_local_config | tail -n 1 | tr -d '\r')"
if [[ "$CONFIG_VALIDATION" == ERROR:* ]]; then
  show_dialog "${CONFIG_VALIDATION#ERROR: }"
  exit 1
fi
CONFIG_PATH="$LOCAL_CONFIG_PATH"
chmod 600 "$CONFIG_PATH" >/dev/null 2>&1 || true

cd "$PROJECT_ROOT" || exit 1
"$NODE_BIN" "$AGENT_SCRIPT" configure --config "$CONFIG_PATH" --choose-folder >> "$LOG_FILE" 2>&1
if [ $? -ne 0 ]; then
  show_dialog "Configureren is niet gelukt. Bekijk het logbestand: $LOG_FILE"
  exit 1
fi

"$NODE_BIN" "$AGENT_SCRIPT" watch --config "$CONFIG_PATH" --once --quiet >> "$LOG_FILE" 2>&1
if [ $? -ne 0 ]; then
  show_dialog "Melody kon niet verbinden. Maak in Melody een nieuwe agent-token aan, download een verse melody-companion.json en probeer opnieuw. Logbestand: $LOG_FILE"
  exit 1
fi

/usr/bin/pkill -f "melody-agent.js watch --config" >/dev/null 2>&1 || true
nohup "$NODE_BIN" "$AGENT_SCRIPT" watch --config "$CONFIG_PATH" --quiet >> "$LOG_FILE" 2>&1 &
show_dialog "Melody Companion draait nu op de achtergrond. Open Melody > Bibliotheek > Companion om de status te zien en speel daarna je tracks af."
